MySQL

您所在的位置:网站首页 varchar 数字 MySQL

MySQL

2024-06-22 09:18| 来源: 网络整理| 查看: 265

概述

在数据库设计中,选择合适的数据类型对于确保数据的有效存储和查询效率至关重要。对于需要存储文本信息的场景,我们常会使用VARCHAR类型。 然而,对于不同语言的字符,VARCHAR所能存储的数量会有所不同。

本文将探讨MySQL中VARCHAR(200)是否能存储200个汉字,并解释其背后的原理。

先说结论:在MySQL 5.5及以上版本中,可以。

需求分析

目前互联网公司数据持久化中间件都选了MySQL。 在实际应用中,有时会遇到需要存储大量汉字的需求。例如,备注信息最多可以填写200个汉字,这时我们需要确定MySQL中的VARCHAR(200)是否能满足这一需求。

MySQL VARCHAR与汉字存储

在MySQL中,VARCHAR类型的字段用于存储可变长度的字符串,长度可以是0到65,535之间的值,VARCHAR的有效最大长度取决于最大行大小(65,535字节,在所有列之间共享)和使用的语言环境。 其定义的数字参数表示该字段可以存储的最大字符数。 然而,这个“字符数”并不是指的“汉字数”,也不是字节数。 譬如VARCHAR(6)代表最多可以存储6个字符。

实际上,一个汉字在计算机中的存储通常需要多个字节,而英文字符一般只需要一个字节。因此,能存储的汉字数量会受到所选字符集的影响。

不同字符集不同编码每个字符占用的磁盘空间是不同的: ASCII使用一个字节(8 bits)表示一个字符,最多只能表示256个字符; GB2312使用2个字节表示一个中文字符; Big5使用2个字节表示一个中文字符; ISO8859-1【Latin-1】使用1个字节表示一个字符; Unicode字符集,使用不同的编码方案,一个字符占用的空间也不不同的: UTF-8编码使用1~4个字节表示一个符号,会根据不同的符号而变化字节长度; UTF-16编码使用用两个字节或四个字节表示一个字符; UTF-32编码使用用四个字节表示一个字符。 唐成,公众号:的数字化之路计算机基础篇 | 一看就懂的字符集、ASCII、GBK、UTF-8、Unicode、乱码、字符编码问题

对于英文字符,如果采用ASCII字符集【latin1】,每个字符占用1个字节。

因此,VARCHAR(200)可以存储200个英文字符。 对于汉字,如果使用utf8mb4字符集(这是非常常见的情况),

代码语言:javascript复制从MySQL 5.5开始,引入了utf8mb4字符集。utf8mb4 is a superset of utf8并且兼容utf8, 它支持最多4个字节的UTF-8编码,允许存储更多的字符, 包括一些特殊的Unicode字符,如表情符号、某些古文字等。

一个汉字通常占用3个字节。 在这种情况下,VARCHAR(200)大约可以存储66个汉字左右(200字节/3字节/汉字)。 这样的话,如果需求是存储200个汉字,并且数据库使用的是utf8mb4字符集,那么应该选择更大的VARCHAR定义,如VARCHAR(600)。

真的是这样吗?

不是的。 Show the code: 脱离版本讲可行性就是耍流氓。 先来看当前MySQL的版本:

Tips:200字符较长,一眼很难判断是否超过200,下面使用VARCHAR(6)来进行演示

代码语言:javascript复制CREATE TABLE `user` ( `id` int NOT NULL AUTO_INCREMENT, `name` varchar(6) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '名称', `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'create time', `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'modify time', PRIMARY KEY (`id`) ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '测试varchar存储汉字' INSERT INTO user(name) VALUES ('壹贰参肆伍陆'); INSERT INTO user(name) VALUES ('壹贰参肆伍陆柒');

果然,VARCHAR(6)是可以存6个汉字的。 从字符编码角度看,在utf8mb4编码中,英文字符通常只需要一个字节,而中文字符可能需要三个字节。但是在MySQL中,VARCHAR类型的长度限制是按照字符数来计算的,而不是字节数。这意味着,无论存储的是英文还是中文,只要字符数不超过定义的长度,就可以存储。

从数据库版本角度看,在MySQL 5.0及以上版本中,VARCHAR类型的最大长度可以达到65535个字符,但由于需要额外1到2个字节来存储数据长度,实际可存储的最大字符数为65533个字符。因此,如果您的MySQL版本是5.0或以上,那么VARCHAR(6)可以存储的字符数实际上是6个,而不是2个中文汉字。

从字段定义的角度看,在user表的DML语句中,name字段被定义为VARCHAR(6),这意味着它可以存储最多6个字符。当您insert“壹贰参肆伍陆”时,它是6个字符,没有超过字段定义的长度限制,因此可以成功存储。

VARCHAR能存储65533个字符?

答案:在utf8mb4编码时,不能。 最多可以存16383个字符。

代码语言:javascript复制CREATE TABLE `msg` ( `id` int NOT NULL AUTO_INCREMENT, `msg` varchar(65533) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '消息,测试varchar最大长度', PRIMARY KEY (`id`) ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '测试varchar存储汉字'; 代码语言:javascript复制CREATE TABLE `msg` ( `id` int NOT NULL AUTO_INCREMENT, `msg` varchar(16383) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '消息,测试varchar最大长度', PRIMARY KEY (`id`) ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '测试varchar存储汉字';

因为id这一列也占用了空间。 只保留msg列:

代码语言:javascript复制CREATE TABLE `msg` ( `msg` varchar(16383) ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4;

为什么是16383而不是65533?

因为utf8mb4可以存储多达4个字节的Unicode字符。 65533/4=16383。

这个最保守的数字,让VARCHAR类型有了更大的确定性和稳定性。

小结

在选择MySQL的VARCHAR类型时,不仅要考虑存储的字符数量,还要考虑所使用的字符集。由于不同字符集下字符所占用的字节数不同,相同的VARCHAR定义能够存储的汉字数量也会有所不同。 在设计数据库时,应充分考虑这些因素,以确保能够满足实际的存储需求。

REFERENCE

11.3.2 The CHAR and VARCHAR Types https://dev.mysql.com/doc/refman/5.7/en/char.html

8.4.7 Limits on Table Column Count and Row Size https://dev.mysql.com/doc/refman/5.7/en/column-count-limit.html

一次故障解决过程梳理:mysql varchar text timestamp https://www.cnblogs.com/softidea/p/6681198.html

计算机基础篇 | 一看就懂的字符集、ASCII、GBK、UTF-8、Unicode、乱码、字符编码问题

http://stackoverflow.com/questions/2023481/mysql-large-varchar-vs-text



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3